package com.example.tliaswebmanagement.AOP;

import lombok.extern.slf4j.Slf4j;
import org.aopalliance.intercept.Joinpoint;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;


/**
 * 入门方法
 */
@Slf4j
//@Aspect  // 标识当前是一个 AOP 类
//@Component
public class RecordTimeAspect {
    // 抽取公共点表达式
    @Pointcut("execution(* com.example.tliaswebmanagement.service.DeptService.*(..))")
    private void pt() {}
    // 前置通知
    @Before("pt()")
    public void before(JoinPoint joinpoint) {
        log.info("------ before前置通知执行");
        // 1. 获取目标对象
        Object target = joinpoint.getTarget();
        log.info("获取的目标方法：{}", target);
        // 2. 获取目标类的类名
        String name = joinpoint.getTarget().getClass().getName();
        log.info("获取的目标类：{}", name);
        // 3. 获取目标方法的方法名
        String methodName = joinpoint.getSignature().getName();
        log.info("获取的目标方法：{}", methodName);
        // 4. 获取目标方法的请求参数
        Object[] args = joinpoint.getArgs();
        log.info("目标方法的参数：{}", args);
    }
    // 环绕通知
    @Around("pt()")
    public Object recordTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 1. 记录方法运行的开始时间
        long begin = System.currentTimeMillis();
        // 2. 执行原始的方法
        Object result = proceedingJoinPoint.proceed();
        // 3. 记录方法运行的结束时间
        long end = System.currentTimeMillis();
        // 4. 计算耗时
        long time = end - begin;
        log.info("方法{}运行耗时：{}ms", proceedingJoinPoint.getSignature().getName(), time);

        return result;
    }
    // 后置通知
    @After("pt()")
    public void after() {
        log.info("------ after后置通知执行");
    }
    // 返回后通知
    @AfterReturning("pt()")
    public void returning() {
        log.info("------ AfterReturning返回后通知执行");
    }
}
